#include <bits/stdc++.h>
using namespace std;
const int M = 1e6 + 10;
deque<int> q;
int n, w[M], sum[M], f[M], g[M];
int calc(int k) { return sum[k] + g[k]; }

int main() {
  scanf("%d", &n);
  for (int i = n; i >= 1; i--)
    scanf("%d", &w[i]);
  for (int i = 1; i <= n; i++)
    sum[i] = sum[i - 1] + w[i];

  int last = 0;
  for (int i = 1; i <= n; i++) {
    while (q.size() && sum[i] >= g[q.front()] + sum[q.front()]) {
      last = q.front(); 
          // 由于本人比较懒，不想写模拟双向队列判断出队。
          //所以需要一个last来记录最后一个满足s[i]+g[i]<=s[i]
                     // 的下标
      q.pop_front();
    }
    g[i] = sum[i] - sum[last];
    f[i] = f[last] + 1;
    while (q.size() && calc(q.back()) > calc(i))
      q.pop_back();
    q.push_back(i);
  }

  printf("%d\n", f[n]);
  return 0;
}
/*

定义f[i]表示最后一个区间的右端点为第i个数的时候所能分成的最大区间数。

但是只靠f[i]数组无法满足题目中的限制条件。于是需要定义
g[i] 表示在最优的状态下最后一个区间内的数字和。
同时定义一个sum[i] 表示前i个数字之和。
有一个很显然的贪心性质，每一个区间的数字之和越小越好。
*/